package com.tarena.emqx.demo.config;

import com.tarena.emqx.demo.consumer.EmqxConsumer;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.UUID;

/**
 * 作为整合emqx的客户端代码对象配置类
 * 给我们提供一个可以连接本地emqx的client对象 在容器中主驻留
 */
@Configuration
@Slf4j
public class EmqxClientConfig {
    //使用@Bean管理一个容器的bean对象 MqttClient
    @Bean
    public MqttClient mqttClient() throws Exception {
        //创建这个对象 同时 配置属性 连接本地emqx localhost:1883
        //1.连接地址 底层tcp协议
        String address="tcp://localhost:1883";
        //2.client 无论是如何连接emqx需要一个客户端id唯一值
        String clientId= UUID.randomUUID().toString().replace("-", "");
        //3.新建一个客户端对象 使用上述2个属性
        MqttClient mqttClient=new MqttClient(address, clientId);
        //4.mqttClient连接emqx这个客户端对象还需要 其他一些连接属性
        MqttConnectOptions options=new MqttConnectOptions();
        //4.1给连接客户端 提供权限 账号密码 admin 1qazxsw2
        options.setUserName("admin");
        options.setPassword("1qazxsw2".toCharArray());
        //4.2网络环境一旦下降 设置自动重连
        options.setAutomaticReconnect(true);
        //4.3 提供软件版本号,连接emqx的版本,保证兼容就行 4 当前emqx5.2.0可以兼容mqtt4版本协议
        options.setMqttVersion(4);
        //4.4 每次通信结束 清理会话 否则会话会复用导致数据逻辑
        options.setCleanSession(true);
        //4.5如果项目代码有消费者,可以在客户端设置消费者对象 订阅消息就可以消费了
        //新建一个消费者对象
        EmqxConsumer consumer=new EmqxConsumer(mqttClient);
        //设置连接客户端 回调,连接成功 连接断开 调用consumer相关方法
        mqttClient.setCallback(consumer);
        //5.将options交给mqttClient
        mqttClient.connect(options);
        return mqttClient;
    }
}
